当前位置:文档之家› 单例模式和工厂模式

单例模式和工厂模式

单例模式和工厂模式
单例模式和工厂模式

模式中的单例模式分为:饿汉模式和懒汉模式。

顾名思义:

饿汉模式是对食物(Singleton)比较渴望的,所有一开始就new了一个来满足(食欲)

饿汉式:

public class Singleton{

private static Singleton singleton = new Singleton ();

private Singleton (){}

public static Singleton getInstance(){return singletion;}

}

饿汉式在声明实例变量时不加final关键字,并且非正常使用时可能存在问题

如:Singleton s = Singleton.getInstance();

s.executeMethod();

s = null; // 非正常使用

当另一个人使用时:

Singleton s = Singleton.getInstance();

s.executeMethod(); // throw a NullPointException

懒汉模式是对食物(Singleton)没兴趣或者懒得自己获取食物,直到饿的时候(用到的时候)才获取一个

懒汉式:

public class Singleton{

private static Singleton singleton = null;

public static synchronized synchronized getInstance(){

if(singleton==null){

singleton = new Singleton();

}

return singleton;

}

}

比较:

饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统

使用,以后不在改变

懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的

推荐使用第一种

懒汉式没有加私有的构造函数

从实现方式来讲他们最大的区别就是懒汉式是延时加载,他在加载类时创建实例,而饿汉式在虚拟机启动的时候就会创建。

一、工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

工厂模式在《Java与模式》中分为三类:

1)简单工厂模式(Simple Factory):不利于产生系列产品;

2)工厂方法模式(Factory Method):又称为多形性工厂;

3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品;

这三种模式从上到下逐步抽象,并且更具一般性。

GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

二、简单工厂模式

简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。

在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。

先来看看它的组成:

1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java 中由一个具体类实现。

三、工厂方法模式

工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。

来看下它的组成:

1)抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。

3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java 中一般有抽象类或者接口来实现。

4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活起来——当有新的产品(即暴发户的汽车)产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。可以看出工厂角色的结构也是符合开闭原则的!

代码:

//抽象产品角色

public interface Moveable {

void run();

}

//具体产品角色

public class Plane implements Moveable {

@Override

public void run() {

System.out.println("plane....");

}

}

public class Broom implements Moveable {

@Override

public void run() {

System.out.println("broom.....");

}

}

//抽象工厂

public abstract class VehicleFactory {

abstract Moveable create();

}

//具体工厂

public class PlaneFactory extends VehicleFactory{

public Moveable create() {

return new Plane();

}

}

public class BroomFactory extends VehicleFactory{

public Moveable create() {

return new Broom();

}

}

//测试类

public class Test {

public static void main(String[] args) {

VehicleFactory factory = new BroomFactory();

Moveable m = factory.create();

m.run();

}

}

可以看出工厂方法的加入,使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。因为如果不能避免这种情况,可以考虑使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。

四、简单工厂和工厂方法模式的比较

工厂方法模式和简单工厂模式在定义上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来, 从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。

反过来讲,简单工厂模式是由工厂方法模式退化而来。设想如果我们非常确定一个系统只需要一个实的工厂类, 那么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来,我们就退化到简单工厂模式了。

五、抽象工厂模式

代码:

//抽象工厂类

public abstract class AbstractFactory {

public abstract Vehicle createVehicle();

public abstract Weapon createWeapon();

public abstract Food createFood();

}

//具体工厂类,其中Food,Vehicle,Weapon是抽象类,

public class DefaultFactory extends AbstractFactory{

@Override

public Food createFood() {

return new Apple();

}

@Override

public Vehicle createVehicle() {

return new Car();

}

@Override

public Weapon createWeapon() {

return new AK47();

}

}

//测试类

public class Test {

public static void main(String[] args) {

AbstractFactory f = new DefaultFactory();

Vehicle v = f.createVehicle();

v.run();

Weapon w = f.createWeapon();

w.shoot();

Food a = f.createFood();

a.printName();

}

}

在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。

六、总结。

(1)简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。

(2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。

(3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。

三种工厂模式区别

工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 区别: 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。 看了网络上很多关于设计模式的方法,有的模式看起来相似,但本质还是区别很大的.像简单工厂,工厂方法和抽象工厂就有很明显的区别. 有一个比较好理解的例子,在这跟大家介绍下: 1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了. 2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来. 3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园. 所以我个人认为,简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品. 具体例子: 1.简单工厂: using System; public interface ICar { void run(); } public class BMWCar : ICar { public void run() { Console.WriteLine("BMWCar run"); } }

软件设计模式复习

创建型模式概述 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。 模式动机 考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等),这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。模式定义 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 模式分析 将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。 在调用工厂类的工厂方法时,由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数即可,在实际开发中,还可以在调用时将所传入的参数保存在XML等格式的配置文件中,修改参数时无须修改任何Java源代码。 简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。 简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。 简单工厂模式的不足 在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,加入必要的处理逻辑,这违背了“开闭原则”。在简单工厂模式中,所有的产品都是由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题。 模式动机 考虑这样一个系统,按钮工厂类可以返回一个具体的按钮实例,如圆形按钮、矩形按钮、菱形按钮等。在这个系统中,如果需要增加一种新类型的按钮,如椭圆形按钮,那么除了增加一个新的具体产品类之外,还需要修改工厂类的代码,这就使得整个设计在一定程度上违反了“开闭原则”。 模式定义 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。 模式分析 工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方

工厂模式系列文章

设计模式概述
在面向对象的编程中,软件编程人员更加注重以前的代码的重用性和可维护性. 设计模式使人 们可以更加简单方便地复用成功的设计和体系结构. 将已证实的技术表述成设计模式也会使新系 统开发者更加容易理解其设计思路. 模式是对前人设计经验的总结. 一般而言,一个模式有四个基本要素
1 模式名称(ptennm) 一个助记名, . atr ae
2 .问题(rbe) 描述了应该在何时使用模式.它解释了设计问题和问题存在的前因后果, polm: 它可能描述了特定的设计问题, 如怎样用对象表示算法等. 也可能描述了导致不灵活设计的类或 对象结构.有时候,问题部分会包括使用模式必须满足的一系列先决条件. 3 .解决方案(ouin slto)描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方 式.因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的 设计或实现, 而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合 (类或对象组 合)来解决这个问题. 4 .效果(osqecs cneune)描述了模式应用的效果及使用模式应权衡的问题.尽管我们描述设计 决策时, 并不总提到模式效果, 但它们对于评价设计选择和理解使用模式的代价及好处具有重要 意义.软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题.因为复用是面向 对象设计的要素之一,所以模式效果包括它对系统的灵活性,扩充性或可移植性的影响,显式地 列出这些效果对理解和评价这些模式很有帮助.
一些基本的设计模式
Asrc Fcoy: 供一个创建一系列相关或相互依赖对象的接口, btat atr 提 而无需指定它们具体的类.
Aatr:将一个类的接口转换成客户希望的另外一个接口.Adapter dpe 模式使得原本由于 接口不兼容而不能一起工作的那些类可以一起工作. Big rde:将抽象部分与它的实现部分分离,使它们都可以独立地变化. Bidr:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. ule Cano epniiiy:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会 hi fRsosblt 处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它. Cmad:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排 omn 队或记录请求日志,以及支持可取消的操作. Cmoie:将对象组合成树形结构以表示"部分opst 整体"的层次结构.它使得客户对单个对象 和复合对象的使用具有一致性. Dcrtr:动态地给一个对象添加一些额外的职责.就扩展功能而言, 它比生成子类方式更 eoao 为灵活. Fcd aae:为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口, 这个接口使得这一子系统更加容易使用. FcoyMto atr ehd:定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Fcoy atr Mto 使一个类的实例化延迟到其子类. ehd
Created by PDF Generator (https://www.doczj.com/doc/fe3910312.html,/), to remove this mark, please buy the software.

(工厂管理)J设计模式之工厂模式(F)

Java设计模式之工厂模式(Factory) 时间:2009-08-04 17:23 来源:未知作者:和水柔石 CSDN IE QQ百度我挖Google POCO Yahoo新浪365Key天极和讯博拉Live奇客鲜果收客饭否叽歪挖客 核心提示:作者:和水柔石一、引子话说十年前,有一个爆发户,他家有三辆汽车(Benz (奔驰)、Bmw (宝马)、Audi (奥迪)看来这人比较爱国,没有日本车),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz 车后跟司机说开奔驰车!,坐上Bmw 后他说开 作者:和水柔石 一、引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz (奔驰)、Bmw (宝马)、Audi (奥迪)看来这人比较爱国,没有日本车),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz 车后跟司机说" 开奔驰车!" ,坐上Bmw 后他说" 开宝马车!" ,坐上Audi 后他说" 开奥迪车!" 。你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C 语言一直是通过这种方式来坐车的!幸运的是,这种有病的现象在OO 语言中可以避免了。下面以Java 语言为基础来引入我们本文的主题:工厂模式!! 二、简介 工厂模式主要是为创建对象提供了接口。工厂模式按照《Java 与模式》中的提法分为三类: 1. 简单工厂模式(Simple Factory) 2. 工厂方法模式(Factory Method) 3. 抽象工厂模式(Abstract Factory) 这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。下面是使用工厂模式的两种情况: 1. 在编码时不能预见需要创建哪种类的实例。 2. 系统不应依赖于产品类实例如何被创建、组合和表达的细节 三、简单工厂模式 顾名思义,这个模式本身很简单,而且使用在业务较简单的情况下。 它由三种角色组成(关系见下面的类图): 1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java 中它往往由一个具体类实现。 2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java 中由接口或者抽象类来实现。 3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java 中由一个具体类实现。

工厂模式有以下几种形态

工厂模式有以下几种形态: 简单工厂(Simple Factory)模式 工厂方法(Factory Method)模式,又称多形性工厂(Polymorphic Factory)模式 抽象工厂(Abstract Factory)模式,又称工具箱(Kit或Toolkit)模式 在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。 工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给子类去作。

工厂方法模式和简单工厂模式在定义上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来, 从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。 反过来讲,简单工厂模式是由工厂方法模式退化而来。设想如果我们非常确定一个系统只需要一个实的工厂类, 那么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来,我们就退化到简单工厂模式了。 抽象工厂模式是所有形态的工厂模式中最为抽象和最具广泛性的一种形态,抽象工厂模式是工厂方法模式的进一步扩广化和抽象化。如下图:

在抽象工厂模式中,抽象产品(AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。 总结:简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。 工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。 抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。

工厂模式

工厂模式 工厂模式 用工厂方法代替了new操作, 将选择实现类, 创建对象统一管理和控制.从而将调用者(Client)与实现类进行解耦.实现了创建者与调用者分离; 使用场景 JDK中Calendar的getInstance方法; JDBC中Connection对象的获取; MyBatis中SqlSessionFactory创建SqlSession; SpringIoC容器创建并管理Bean对象; 反射Class对象的newInstance; …. 静态工厂模式 静态工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类,而客户端看到的也只是产品的抽象对象(interface),因此无需关心到底是返回了哪个子类 我们以运算符类为例, 解释静态工厂模式. Operator接口 /** * 运算符接口 * Created by jifang on 15/12/7. */ public interface Operator { T getResult(T... args); } 实现类 public class AddOperator implements Operator { @Override public Integer getResult(Integer... args) {

int result = 0; for (int arg : args) { result += arg; } return result; } } public class MultiOperator implements Operator { @Override public Integer getResult(Integer... args) { int result = 1; for (int arg : args) { result *= arg; } return result; } } 工厂 /** * 静态工厂(注: 只返回产品的抽象[即接口]) * 包含两种实现策略 * 1. 根据传入的operator名进行实例化对象 * 2. 直接调用相应的构造实例的方法 * Created by jifang on 15/12/7. */ public class OperatorFactory { public static Operator createOperator(String operName) { Operator operator; switch (operName) { case "+": operator = new AddOperator(); break; case "*": operator = new MultiOperator(); break; default: throw new RuntimeException("Wrong Operator Name: " + operName); } return operator;

简单工厂模式、工厂方法模式实验

1. 使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形(Rectangle)的绘图工具工厂类,每个几何图形均有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,抛出一个UnSupportedShapeException。绘制类图并编程模拟实现。 代码实现 Shape.java Circle.java

Rectangle.java ShapeFactory.java UnSupportedShapeException.java Test.java

如果向工厂类传入参数“circle”,则返回一个Circle对象,如果传入参数“rectangle”,则返回一个Rectangle对象。现需要增加一个新的三角形Triangle类,如果传入参数“triangle”,则返回一个Triangle对象,对代码进行修改并注意工厂类的变化。 添加一个Triangle类 Triangle.java ShapeFactory类的代码,违背了开闭原则。 ShapeFactory.java

Assert.java 2. 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG 图片读取器(JpgReader)用于读取JPG格式的图片,所有的图片读取器都有读取图片的方法readImage()。图片读取器对象通过图片读取器工厂ImageReaderFactory来创建,ImageReaderFactory是一个抽象工厂接口,定义了创建图片读取器的工厂方法createImageReader(),其实现类GifReaderFactory用于创建GIF图片读取器(GifReader)对象,

设计模式简单工厂

简单工厂设计模式 目录 1.1摘要 (2) 2.1关键字 (2) 3.1开发工具 (2) 4.1简单工厂模式动机与定义: (2) 4.1.1模式动机 (2) 4.1.2模式定义 (2) 5.1简单工厂模式结构 (3) 6.1简单工厂模式实例: (4) 6.1.1代码分析 (4) 6.1.1.1Product(Shape抽象类)代码: (4) 6.1.1.2ConcreteProduct(Juxing,YuanXing,SanJiao具体产品类)代码:5 JuXing类: (5) YuanXing类: (6) SanJiao类: (6) 6.1.1.3Factory(Factory类)代码: (7) 6.1.1.4 (main类): (7) 6.1.1.5运行结果: (10) 7.1结论 (10) 8.1参考文献: (10)

1.1摘要 本文从面向对象的角度对java接口的概念、作用以及使用它的好处做分析,讲解面向接口编程的方法,结合初步接触软件开发的人员习惯,从简单工厂设计模式的概念和其结构以及用途进行解析,重点讲解简单工厂设计模式在软件开发过程中的作用和好处,通过一些实例来说明简单工厂设计模式的特点。 2.1关键字 面向对象;java接口;接口编程;简单工厂设计模式。 3.1开发工具 Eclipse java语言开发 4.1简单工厂模式动机与定义: 在实际的软件开发过程中有时需要创建一些来自于相同父类的类的实例,为此可以专门定义一个类来负责创建这些类的实例,这些被创建的实例具有共同的父类。在这种情况下,可以通过传入不同的参数从而获取不同的对象,理由Java语言的特征,习惯上将创建其他类实例的方法定义为static方法,外部不需要实例化这个类就可以直接调用该方法来获得需要的对象,该方法也成为静态工厂方法。 4.1.1模式动机 考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮,矩形按钮等),这些按钮都源自同一个基类,不过在继承基类之后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。 4.1.2模式定义 简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。

简单工厂模式实验说明书

工厂设计模式实验说明书 一、实验目的 (1)熟悉简单工厂模式、工厂模式的提出动机,了解类结构及定义。 (2)熟悉简单工厂模式、工厂模式的的优缺点、适用场合。 (3)学习如何使用简单工厂模式和工厂模式。 二、实验内容及步骤 (1)首先熟悉根据理论课学习的简单工厂模式、工厂模式的内容 (2)上机熟悉程序代码,以加深对这两种设计模式的理解。 (3)然后,根据设定的实验问题,分别以简单工厂模式和工厂模式加以实现,完成相应代码编写,并画出相应的类结构图。 三、实验任务 (1)对设定问题分别编写简单工厂模式、工厂模式的实现代码,以及类结构图; (2)完成实验报告并提交。 四、实验报告的书写方法及书写内容 (1)实验目的 熟悉简单工厂设计模式、工厂设计模式的原理、模式提出的动机、实现方式、优缺点及适 用场合。 (2)实验内容 1. 以简单工厂设计模式实现设定问题求解。 2. 以工厂设计模式实现设定问题求解。 3. 通过实现代码的运行加深对简单工厂模式和工厂模式的理解 (3)完成的工作 1. 程序代码 2. 类结构图 3. 实验报告 (4)总结 1. 简工厂设计模式的优缺点:xxxx 2. 工厂设计模式的优缺点:xxxx 3. 总结,意见、建议、体会等:xxxx *实验设定问题: 在某OA系统中,系统根据对比用户在登录时输入的账号和密码以及在数据库中存储的账号和密码是否一致来进行身份验证,如果验证通过,则取出存储在数据库中的用户权限等级(以整数形式存储),根据不同的权限等级创建不同等级的用户对象,不同等级的用户对象拥有不同的操作权限。现使用简单工厂模式来设计该权限管理模块。其类结构如图去所示,请完成其简单的代码程序。 Administrator +diffOperation () ...: void UserFactory +getUser (int permission) ... : User Employee +diffOperation () ... : void Manager +diffOperation () ...: void User + +sameOperation () diffOperation () ... : void : void

工厂方法模式(讲)

工厂方法模式(Factory Method)—对象创建型模式 工厂模式有以下几种形态: 简单工厂(Simple Factory)模式; 工厂方法(Factory Method)模式,又称多形性工厂(Polymorphic Factory)模式; 抽象工厂(Abstract Factory)模式,又称工具箱(Kit或Toolkit)模式 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。如何应对这种变化?提供一种封装机制来隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变?这就是要说的Factory Method模式了。 意图 定义一个用户创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。 工厂方法模式解说 在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。在Factory Method模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应。 现在我们考虑一个日志记录的例子(这里我们只是为了说明Factory Method模

记录的类,支持记录的方法有FileLog和EventLog两种方式。在这里我们先不谈设计模式,那么这个日志记录的类就很好实现了: 1///

2///日志记录类 3/// 4public class Log 5 { 6 7public void WriteEvent() 8 { 9 Console.WriteLine("EventLog Success!"); 10 } 11 12public void WriteFile() 13 { 14 Console.WriteLine("FileLog Success!"); 15 } 16 17public void Write(string LogType) 18 { 19switch(LogType.ToLower()) 20 { 21case "event":

工厂方法设计模式

实验三工厂方法设计模式 实验目的:加深对工厂方法设计模式及创建型设计模式原理的理解 实验环境:C#.Net 实验内容: 某系统日志记录器要求支持多种日志记录方式,如文件日志记录和到数据库日志记录等,且用户在应用场景下可以根据要求动态选择日志记录方式,现使用工厂方法设计模式设计该系统。 实验过程: 1、构建实现场景,画出UML类图 2、实现代码(C#) static void Main(string [] args) { Console .WriteLine("采用文件日志记录方式"); ILogFactory fileLogFactory = new FileLogFactory(); Log filelog = fileLogFactory .CreateLog();

filelog .write(); Console .WriteLine("=============================="); Console .WriteLine("采用数据库日志记录方式"); ILogFactory databaseLogFactory = new DatabaseLogFactory(); Log databaseLog = databaseLogFactory .CreateLog(); databaseLog .write(); } ///

///日志抽象类 /// public abstract class Log { public abstract void write(); } /// ///文件日志类 ///

工厂模式的三种类型

工厂模式的三种类型: 1抽象工厂模式是所有形态的工厂模式中最为抽 象和最其一般性的。抽象工厂模式可以向客户端 提供一个接口,使得客户端在不必指定产品的具 体类型的情况下,能够创建多个产品族的产品对 象。 1.抽象工厂(Creator)角色 抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。 2.具体工厂(Concrete Creator)角色 具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。 3.抽象(Product)角色 抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。 4.具体产品(Concrete Product)角色 抽象模式所创建的具体实例对象 总结:抽象工厂中方法对应产品结构,具体工厂对应产品族。 2工厂方法模式同样属于类的创建型模式又被称 为多态工厂模式。工厂方法模式的意义是定义一个创建 产品对象的工厂接口,将实际创建工作推迟到子类当中。 核心工厂类不再负责产品的创建,这样核心类成为一个 抽象工厂角色,仅负责具体工厂子类必须实现的接口, 这样进一步抽象化的好处是使得工厂方法模式可以使系 统在不修改具体工厂角色的情况下引进新的产品。

1.抽象工厂(Creator)角色 工厂方法模式的核心,任何工厂类都必须实现这个接口。 2.具体工厂(Concrete Creator)角色 具体工厂类是抽象工厂的一个实现,负责实例化产品对象。 3.抽象(Product)角色 工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。 4.具体产品(Concrete Product)角色 工厂方法模式所创建的具体实例对象 工厂方法模式与简单工厂模式在结构上的不同不是很明显。工厂方 法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具 体类上。 工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工 厂类都有共同的接口,或者有共同的抽象父类。 当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对 象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也 不需要修改客户端,很好的符合了“开放-封闭”原则。而简单工厂 模式在添加新产品对象后不得不修改工厂方法,扩展性不好。 工厂方法模式退化后可以演变成简单工厂模式。 3简单工厂模式属于类的创建型模式,又叫做静态 工厂方法模式。通过专门定义一个类来负责创建 其他类的实例,被创建的实例通常都具有共同的 父类。 1.工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。 2.抽象(Product)角色 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。 3.具体产品(Concrete Product)角色

java三种工厂模式

java三种工厂模式 适用场合: 1、工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类。只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值。本节概括了这些场合。 1.1 动态实现 如果需要像前面自行车的例子一样,创建一些用不同方式实现同一接口的对象,那么可以使用一个工厂方法或简单工厂对象来简化选择实现的过程。这种选择可以是明确进行的也可以是隐含的。前者如自行车那个例子,顾客可以选择需要的自行车型号;而下一节所讲的XHR工厂那个例子则属于后者,该例中所返回的连接对象的类型取决于所探查到的带宽和网络延时等因素。在这些场合下,你通常要与一系列实现了同一个接口、可以被同等对待的类打交道。这是JavaScript中使用工厂模式的最常见的原因。 1.2 节省设置开销

如果对象需要进行复杂并且彼此相关的设置,那么使用工厂模式可以减少每种对象所需的代码量。如果这种设置只需要为特定类型的所有实例执行一次即可,这种作用尤其突出。把这种设置代码放到类的构造函数中并不是一种高效的做法,这是因为即便设置工作已经完成,每次创建新实例的时候这些代码还是会执行,而且这样做会把设置代码分散到不同的类中。工厂方法非常适合于这种场合。它可以在实例化所有需要的对象之前先一次性地进行设置。无论有多少不同的类会被实例化,这种办法都可以让设置代码集中在一个地方。 如果所用的类要求加载外部库的话,这尤其有用。工厂方法可以对这些库进行检查并动态加载那些未找到的库。这些设置代码只存在于一个地方,因此以后改起来也方便得多。 1.3 用许多小型对象组成一个大对象 工厂方法可以用来创建封装了许多较小对象的对象。考虑一下自行车对象的构造函数。自行车包含着许多更小的子系统:车轮、车架、传动部件以及车闸等。如果你不想让某个子系统与较大的那个对象之间形成强耦合,而是想在运行时从许多子系统中进行挑选的话,那么工厂方法是一个理想的选择。使用这种技术,某天你可以为售出的所有自行车配上某种链条,要是第二天找到

C#设计模式 之 工厂方法模式

工厂方法模式(Factory Method) 耦合关系: 动机(Motivation): 在软件系统中,由于需求的变化,"这个对象的具体实现"经常面临着剧烈的变化,但它却有比较稳定的接口。 如何应对这种变化呢?提供一种封装机制来隔离出"这个易变对象"的变化,从而保持系统中"其它依赖的对象"不随需求的变化而变化。 意图(Intent): 定义一个用户创建对象的接口,让子类决定实例哪一个类。Factory Method使一个类的实例化延迟到子类。 ----------《设计模式》GOF 结构图(Struct):

生活实例: 适用性: 1.当一个类不知道它所必须创建的对象类的时候。 2.当一个类希望由它子类来指定它所创建对象的时候。 3.当类将创建对象的职责委托给多个帮助子类中的某个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。 实例代码: CarFactory类: 1public abstract class CarFactory 2{ 3public abstract Car CarCreate(); 4} Car类: 1public abstract class Car 2{ 3public abstract void StartUp(); 4public abstract void Run(); 5public abstract void Stop(); 6 7} HongQiCarFactory类:

1public class HongQiCarFactory:CarFactory 2{ 3public override Car CarCreate() 4{ 5return new HongQiCar(); 6} 7} BMWCarFactory类: 1public class BMWCarFactory:CarFactory 2{ 3public override Car CarCreate() 4{ 5return new BMWCar(); 6} 7} HongQiCar类: 1public class HongQiCar:Car 2{ 3public override void StartUp() 4{ 5Console.WriteLine("Test HongQiCar start-up speed!"); 6} 7public override void Run() 8{ 9Console.WriteLine("The HongQiCar run is very quickly!"); 10} 11public override void Stop() 12{ 13Console.WriteLine("The slow stop time is3second"); 14} 15} BMWCar类: 1public class BMWCar:Car 2{

常见几种显示器进入工厂模式的方法

常见几种显示器进入工厂模式的方法 2007-11-17 00:05:标签:pc知识 常见几种显示器进入工厂模式的方法 ⒈方正显示器 ⑴方正15英寸和17英寸飞梭显示器:开机前按住飞梭键后再开机即可进入工厂模式。 ⑵方正OSD显示器:开机前按住最中间那个按键后再开机就可以进入工厂模式。 ⑶方正15英寸数控显示器:先按住“RESE”键后再开机,直到调整指示灯闪烁为止,即表示已经进入工厂模式。 ⑷方正FG796—NS显示器:显示器关机后,同时按住“UP”键和“DOWN”键,再按下电源开关开机,直到指示灯闪烁,即进入工厂模式。 说明:方正显示器有的机型在“工厂模式”中还可以查看显示器的工作时间。此项功能可以帮助用户很方便的检查显示器的实际使用时间,以防止商家把样品机二次装箱后再当成新机卖出。 ⒉ EMC显示器 ⑴ EMC D777显示器:该机进入工厂模式的方法很特殊,关闭显示器电源后,先取下电源插头,按住菜单选择不松手,再插上电源插头,按下电源开关开机,等待屏幕上出现“OSD”菜单时即已经进入工厂调整模式。 ⑵ EMC797显示器:该机进入工厂模式的方法也很特殊。关闭显示器电源后,取下电源插头,按下控制面板最上方的调节键不松手,再插上电源插头,按下电源开关开机,则显示器进入工厂模式。 ⑶ EMC D17英寸纯平显示器:关机后,先同时按住“U”键和“退出”键,再按下电源开关开机,则屏幕的左上角出现工厂模式调节选项。 ⑷EMC570显示器:关机后,按住飞梭键不松手,再按住电源开关开机,这时,如果直接按下飞梭键,屏幕显示的是用户菜单;而旋转飞梭键则进入工厂模式状态下的英文菜单。调试结束后,再按开关机键一次,则退出工厂模式。 ⒊厦华显示器 ⑴厦华1769显示器:关机后,按下电源开关开机,注意不要松手,再按下飞梭键,也保持按住状态,最后松开电源开关,则屏幕出现“FACTORY OSD”工厂模式。 ⑵厦华15 Ⅲ显示器:先按住消磁键,再按下飞梭键,然后放开消磁键,直到屏幕出现“FACTORY OSD”字样,就进入了工厂模式。 ⒋ TCL显示器 ⑴ TCL M506显示器:同时按住“SELECT”键和“+”键开机,则进入工厂设置状态。按下“SELECT”键改变调整选项,按“+”或“-”键进行数据调整,当调整至上、下限时,相应的指示条闪烁。 ⑵TCL M505显示器:先按住任意键后使“OSD”菜单出现,调整“+”键或“-”键,使其选中右上角的“ZOOM”图标,接连按两次“8”号键,注意第二次要按住约4~5秒钟时间,则屏幕出现工厂模式调节选项。 ⑶TCL7XX系列显示器:按“MENU”键呼出“OSD”菜单,按右键移动光标至“ZOOM”位置,连按两次“MENU”键不松手,直至工厂模式的调整菜单出现为止。 ⒌长城显示器 ⑴长城1770DI和长城G702FSJ显示器:在待机状态下同时按住“8”号键和“F”键,然后开机,直到屏幕点亮后松开,再按下“F”键即可进入工厂模式。调节完毕,按“EXIT”键,即可退出工厂模式。 ⑵长城C-1524显示器:在待机状态下按住“SELECT”键,然后开机,直到调整指示灯全亮,则进入工厂模式。 ⒍联想显示器 ⑴联想(冠捷)三键机:同时按住左右两键,再按电源开关开机即可进入工厂模式。 ⑵联想新三键机:在开机状态下,若同时按住左右两键,则进入工厂模式的常规项目调试状态。若同时按住上下两键,则进入亮、暗平衡调整。 ⒎飞利浦显示器 ⑴飞利浦109B2显示器:开机后,同时按住左边“T”键和右边“U”键,15秒后即可进入工厂模式。 ⑵飞利浦105S5显示器:先同时按住左边“-”键和右边“OK”键,再按下电源开关开机,则显示器屏幕上出现工厂模式调节选项。 ⒏ LG显示器 ⑴ LG CB775N显示器:同时按下左键和电源键,几秒钟后屏幕闪烁,再进入“OSD”菜单中选择消磁选项,即可进入工厂模式调节选项。 (2)LG775N显示器:在开机状态下按住左键及“set”键,用“下”键把图标调到最下边一项,即进入工厂模式。再按“右”键,在屏幕右边出现“RDDV、SCON、BCUT、ABL”等选项,用“上”“下”和“左”“右”键就可以进行数值调整。按“set”键即可存储所调节的数据。

工厂模式代码及类图

抽象工厂类图: 代码: public interface Sauce { } public class MarinaraSauce implements Sauce{ public MarinaraSauce(){ System.out.println("Add MarinaraSauce..."); } } public class PlumTomatoSauce implements Sauce{ public PlumTomatoSauce(){ System.out.println("Add PlumTomatoSauce..."); } } public interface Dough {

} public class ThickCrustDough implements Dough{ public ThickCrustDough(){ System.out.println("Add ThickCrustDough..."); } } public class ThinCrustDough implements Dough{ public ThinCrustDough(){ System.out.println("Add ThinCrustDough..."); } } public interface Veggies { } public class Onion implements Veggies{ public Onion(){ System.out.println("Add Onion..."); } } public class Mushroom implements Veggies{ public Mushroom(){ System.out.println("Add Mushroom..."); } } public class Garlic implements Veggies{ public Garlic(){ System.out.println("Add Garlic..."); } } public class Eggplant implements Veggies{ public Eggplant(){ System.out.println("Add Eggplant..."); } } public class BlackOlives implements Veggies{ public BlackOlives(){ System.out.println("Add BlackOlives..."); } } public abstract class Pizza { String name; Dough dough; Sauce sauce; Veggies veggies[]; abstract void prepare(); void bake(){ System.out.println("Bake for 25 minutes at 350"); } void cut(){ System.out.println("Cutting the pizza into diagonal slices"); } void box(){ System.out.println("Place pizza in official PizzaStore box"); } void setName(String name){ https://www.doczj.com/doc/fe3910312.html,=name; } String getname(){ return name; } }

C设计模式工厂型设计示例

名 称 Factory Method 结 构 意 图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 适 用 性 ?当一个类不知道它所必须创建的对象的类的时候。 ?当一个类希望由它的子类来指定它所创建的对象的时候。 ?当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。 namespace FactoryMethod_DesignPattern { using System; . . /// public class Client { public static int Main(string[] args) { MyApplication myApplication = new MyApplication(); (); (); return 0;

} } } 一、工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。 在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。 在Factory Method模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应。 二、Factory Method模式角色与结构: 抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

相关主题
文本预览
相关文档 最新文档