工厂模式,属于创建型模式,我们不在自己创建对象,而是交由工厂来创建。
这样的好处是,我们使用工厂来封装对对象的需求,否则,你可能写一大堆if else来判断,然后新增一个对象的话,又得改这段代码。
简单的工厂模式就是,调用者对工厂说,给我一个A零件,工厂就创建一个A零件,调用者说,给我一个C零件,工厂就创建一个C零件。就这么简单。
上图(借用别人的,学习目的:)):
这种简单的代码更清晰:
#产品接口
public interface Product {
public String getName();
}
#产品A
public class ProductA implements Product{
@Override
public String getName() {
// TODO Auto-generated method stub
return "A";
}
}
#产品B
public class ProductB implements Product {
@Override
public String getName() {
// TODO Auto-generated method stub
return "B";
}
}
#工厂
public class ProductFactory {
public static Product getProduct(String name){
if("A".equals(name)){
return new ProductA();
}else if("B".equals(name)){
return new ProductB();
}else return null;
}
}
其实简单工厂模式看上不这么的。还是很废话。如果新增产品C,D,E呢?
一样需要修改工厂。这时用户使用的工厂还是需要改动。这里我们可以用很多方法,例如使用反射,或者使用动态注册(工厂能生产的产品都要在工厂中注册,使用一个key/value来实现,key为名称,value就是创建对象的具体方法或实例)
这时,问题还没有完,工厂的能力是无限的,这时工厂需要生产与上面的产品参数不一样的产品了,这怎么办? 其实上面的工厂是一个很不好的例子,因为这样我们又得增加if else语句了。这下我们发现,其实工厂也是会改变的。那么就把改变的东西封装起来吧。
于是出现了抽象工厂。我们的抽象工厂与抽象产品做接口,具体的东西,就由下面的实现类去折腾吧。
这里,我们把上面的例子改改,假设产品A与产品B不是同一类产品了,他们的创建方法不一样了,A需要增加一个序列号。
public class ProductA implements Product{
private long sero ;
@Override
public String getName() {
// TODO Auto-generated method stub
return "A";
}
public void setSero(long sero){
this.sero = sero;
}
}
而此时,我们的工厂也变成抽象的了。
public interface AbstractFactory {
public Product getProduct();
}
#factory a create productA
public class FactoryA implements AbstractFactory {
private static FactoryA _instance;
private FactoryA(){}
public static FactoryA getInstance(){
if(_instance==null){
_instance = new FactoryA();
}
return _instance;
}
@Override
public Product getProduct() {
// TODO Auto-generated method stub
ProductA p = new ProductA();
p.setSero(10000L);
return p;
}
}
//factory B create ProductB类似,略去
//使用
public static void main(String[] args) {
// TODO Auto-generated method stub
Product p = FactoryA.getInstance().getProduct();
System.out.println(p.getName());
}
这里对工厂使用了单例模式。怎么样,抽象工厂代码更为简洁吧,实际中,可能会拥有很多的产品与工厂,这就需要权衡抽象工厂和简单工厂了。
总之,设计模式中,粒度问题是一个关键问题,如何衡量系统的类的粒度,和系统自身息息相关。如果能准确把握,就能很优雅的解决问题。
- 大小: 4.2 KB
- 大小: 2.9 KB
分享到:
相关推荐
设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)
java设计模式----抽象工厂模式,简单工厂模式代码 代码内部
抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而无需指定它们的具体类。在.NET开发中,这种模式常用于实现多数据库连接,比如连接到MySQL、SQL Server或Oracle等不同的数据库系统。...
抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。 在...
设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)
在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“族”,即一系列相关的对象。在抽象工厂模式中,我们创建一个抽象工厂接口,然后为每一种具体...
抽象工厂模式是创建型设计模式的一种,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定具体类。这种模式的核心在于它允许客户端代码与具体实现细节解耦,使得更换一个产品族变得更为容易。...
抽象工厂模式是设计模式中的一种,它属于创建型模式,主要解决的是当系统有多个产品族,而每个产品族又有多个具体产品时,如何组织代码的问题。在Java中,抽象工厂模式提供了一种创建对象组的方式,使得这些对象属于...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定具体的类。这种模式允许客户端使用一个通用接口来创建一组相关或相互依赖的对象,而无需了解它们的具体实现。在Java或其他面向...
抽象工厂模式是创建型设计模式中的一种,用于创建一系列相关或相互依赖的对象,而无需指定其具体类。抽象工厂模式强调产品的系列,对于有多个产品等级结构的系统非常有用。在抽象工厂模式中,一个工厂负责创建多个...
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口来创建对象,但将具体实现的决定留给子类来决定。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式...
抽象工厂模式是软件设计模式中的一种创建型模式,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定它们的具体类。在Java编程中,抽象工厂模式通常用于实现跨平台或者跨框架的接口,使得系统...
抽象工厂模式通常由以下几个角色构成: 1. **抽象工厂(Abstract Factory)**:定义一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在不同的实现中,这个接口会创建出不同系列的产品。 2. **...
抽象工厂设计模式抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式
抽象工厂模式是设计模式中的一种结构型模式,它提供了一个创建对象族的接口,但允许子类决定实例化哪一个类。这个模式使代码能够独立于实际的产品实现,增强了代码的可扩展性和灵活性。 ### **1. 模式概念** 抽象...
抽象工厂模式可以帮助我们创建一个工厂接口,该接口声明了创建这些组件的方法,然后为每种操作系统实现一个具体的工厂类。 ```java // 抽象工厂接口 public interface GUIFactory { Button createButton(); ...
总的来说,"从哲学角度学习设计模式-抽象工厂"这个主题旨在将哲学思考融入到软件设计中,通过抽象工厂模式,我们不仅可以理解如何构建灵活、可扩展的系统,还能体会到哲学思想如何影响并指导我们的编程实践。...