5种创建型模式
创建型模式,就是用来创建对象的模式,用来帮助一个系统 去创建、组合和表示它的那些对象。GoF23种设计模式中创建型模式有5中,
分别是:工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、单例模式(Singleton)、建造者模式(Bulider)、原型模式(Prototype)。
(1)工厂方法模式(Factory Method):定义一个创建产品对象的工厂类,由该工厂统一创建继承了统一个接口的多个产品对象。根据创建策略的不同,又分为3中类型。
》工厂方法模式:为普通的工厂方法模式。
》多个工厂方法模式:提供了多个工厂方法,分别创建不同的产品对象。
》静态工厂方法对象模式:工厂方法是静态的,不需要实例化不同的工厂即可创建产品对象。(推荐采用)
/**
接口
**/
public interface Animal
{
public int sales();
}
/**
具体类
**/
public Pig implements Animal
{
int price = 10;//价格
int weight = 200;//重量
public int sales()
{
return price*weight;
}
}
public Sheep()
{
int price = 5;
int weight = 100;
int wool;//羊毛
public int sale()
{
return price*weight + wool;
}
}
/**
静态工厂方法模式之核心工厂类
**/
public class Farm3
{
public static Animal productPig()
{
return new Pig();
}
public static Animal productSheep()
{
return new Sheep();
}
}
/**
测试类
**/
public class Fram3Test
{
public static void test(int count1,int count2)
{
//生产对象
Animal animal1 = Fram3.productPig();
Animal animal2 = Fram3.productSheep();
//计算收入
int monery1 = animal.sale()*count1;
int monery2 = animal.sale()*count2;
}
public static void main(String args[])
{
Fram3Test.test(20,30);
}
}
工厂方法模式的应用场景: 凡是出现了大量产品需要创建,并且具有相同的接口时,可以通过工厂方法模式创建。
(2)抽象工厂模式(Abstract Factory):如果产品的树形结构需要扩展,就必须在工厂类中为新增的产品增加创建功能,这显然违背了开闭原则----在拓展时不修改原有的代码。
为了解决以上问题,可以采用抽象工厂模式,即创建与产品类等级相似的工厂等级结构,为每个产品提供一个具体的工厂类。
应用场景:抽象工厂适用于产品结构多变或有可能扩展的产品创建中。但实际上,我们大多数的程序都需要给未来的维护留有扩展的余地,这才符合开闭原则。所以大多数时候我们都会采用抽象工厂模式。当然并不表示普通的工厂方法没有适用的场合,如果产品结构比较固定也比较简单,则可以适用,比如Swing的工厂BorderFactory
(3)单例模式(Singleton):单例模式是一种特殊的工厂方法模式,它适用于一个类只有一个实例的情况,比如窗口管理器、打印缓冲池和文件系统。典型的情况是,那些对象的实例能够被整个软件系统的不同对象访问,因此需要一个全局的访问指针,这便是总所周知的单例模式的应用。
应用场景:使用单例模式有一个前提条件,就是一个系统中某个类的实例必须只有一个,如果可以有多个实例存在,就不能够使用单例模式。具体应用场景:
》系统的全局变量
》系统的全局配置文件
》系统的全局操作函数
只要希望在全局使用一个统一的对象,就可以使用单例模式
(4)建造者模式(Builder):工厂类提供了生产单个产品的功能,而建造者模式则可以将各种产品集中起来进行统一管理,建造这模式也是工厂模式的扩展,区别是它将各种产品集中了起来。建造者模式用来创建复合对象,并把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。比如农场有猪、羊等组成,农场就是一个复合对象。实际上建造者模式等价于多个工厂方法模式加上其测试类所拥有的功能,即它不仅负责创建各个产品,还负责提供计算价钱等管理功能。
(5)原型模式(Prototype):是创建模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。用面向对象的方法来说就是,我们先建立一个原型,然后通过对原型进行复制和修饰的方法,就可以产生一个与原型相似的新对象。即:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。