内容简介:即静态工厂模式1.将对象的创建和使用分开;
六大设计原则
简单工厂模式
即静态工厂模式
1.将对象的创建和使用分开;
2.将生产过程集中,便于集中管理;
3.当需要创建的对象类有变动时,就不用在所有new 的地方修改了,直接修改工厂类即可;
/**
* 简单工厂模式 --- 静态工厂模式
*/
public class StaticFactory {
public static final int TYPE_APPLE = 1;//苹果
public static final int TYPE_ORANGE = 2;//桔子
public static final int TYPE_BANANA = 3;//香蕉
public static Fruit getFruit(int type){
if(TYPE_APPLE == type){
return new Apple();
} else if(TYPE_ORANGE == type){
return new Orange("Peter",80);
} else if(TYPE_BANANA == type){
return new Banana();
}
return null;
}
/**
* 多方法工厂
* @return
*/
public static Fruit getFruitApple(){
return new Apple();
}
public static Fruit getFruitOrange(){
return new Orange("Peter",80);
}
public static Fruit getFruitBanana(){
return new Banana();
}
}
总的来说,简单工厂模式就是 用一个专业类(工厂类)来负责一种产品(水果类)的对象创建
简单工厂模式不属于23种设计模式,是工厂模式的基础.
思考?若工厂生产的产品越来越多,静态工厂不断修改,方法扩展极为庞大,产品品种扩展不优雅.
- 1.不符合单一职责原则:一个类负责了各类水果的创建.
- 2.不符合开闭原则:扩展品种时,需要修改已有代码,修改工厂类.
工厂方法模式
为了解决静态工厂的问题,我们采用工厂方法模式
- 1.将静态工厂打散,每一个水果品类,对应一个水果品类工厂来生产。
- 2.当需要扩展水果品类时,对应扩展一个水果品种的工厂即可。
将工厂类抽象出一个接口,对象的创建方法延迟到工厂子类去实现.
/**
* 工厂方法接口
*/
public interface FruitFactory {
public Fruit getFruit();//摘水果指令
}
/**
* 橘子工厂子类
*/
public class OrangeFactory implements FruitFactory{
public Fruit getFruit(){
return new Orange("Peter",80);
}
}
/**
* 香蕉工厂子类
*/
public class BananaFactory implements FruitFactory{
public Fruit getFruit(){
return new Banana();
}
}
/**
* 苹果工厂子类
*/
public class AppleFactory implements FruitFactory{
public Fruit getFruit(){
return new Apple();
}
}
/**
* 水果获取测试
*
*/
public class FruitTest {
private static FruitFactory fruitFactory;
public static void main(String[] args) {
getFruit();
}
/**
* 获得水果
*/
public static void getFruit(){
//初始化苹果工厂
fruitFactory = new AppleFactory();
Fruit fruit = fruitFactory.getFruit();
fruit.getFruit();
//初始化香蕉工厂
fruitFactory = new BananaFactory ();
Fruit bananafruit = fruitFactory.getFruit();
bananafruit.getFruit();
//想要获取什么水果就实例化哪个工厂
}
}
通过工厂方法模式,解决了单一职责和开闭原则问题。
需要具体的产品则初始化对应的工厂,在spring中经常是配置在配置文件中,
//然后注入进去,面向接口编程我们注入的是接口实现类在配置里 @Autowired private FruitFactory fruitFactory;
为什么使用抽象工厂模式
业务慢慢发展,现在水果店品种增加,那我们按着工厂方法模式新增其他工厂实现类。
现在除了卖水果的服务还要提供额外服务,比如要包装好,同样的我们就新建一个包装工厂接口如下BagFactory负责打包。
/**
* 工厂方法模式
*/
public interface BagFactory {
public Bag getBag();//打包指令
}
/**
* 负责香蕉的打包
*/
public class BananaBagFactory implements BagFactory{
public Bag getBag(){
return new BananaBag();
}
}
/**
* 负责苹果的打包
*/
public class AppleBagFactory implements BagFactory{
public Bag getBag(){
return new AppleBag();
}
}
一个水果店的动作,就有从工厂获取水果,然后从工厂获取打包服务,如下:
/**
* 水果店测试
* Created by Peter on 10/8 008.
*/
public class FruitStoreTest {
private static FruitFactory fruitFactory;
private static BagFactory bagFactory;
public static void main(String[] args) {
pack();
}
/**
* 邮寄打包
*/
public static void pack(){
//初始化苹果工厂
fruitFactory = new AppleFactory();//猎取工厂不对应
Fruit fruit = fruitFactory.getFruit();
fruit.draw();
//初始化苹果包装工厂
bagFactory = new BananaBagFactory();
Bag bag = bagFactory.getBag();
bag.pack();
//....邮寄业务
}
产品类图如下:
同样的,要是再加一个邮寄业务,我们也是同样的新增一个邮寄工厂。
问题?在实际写代码的时候是否会发生这种问题: 即猎取工厂不对应
- 1.初始化苹果工厂获取苹果
- 2.初始化香蕉工厂来做包装业务
- 3.初始化别的邮寄工厂来做邮寄服务
抽象工厂模式
针对上面的问题就要用到我们的抽象工厂模式了。
抽象工厂模式:当一个类别的产品还有多个系列区分时,为了按系列生产商品,使用抽象工厂区分。
比如不同水果有不同包装规格,客户下单时,自动配出包装,
- --生产苹果,配置纸箱包装
- --生产香蕉时,配置竹萝包装
PS:保证客户端只使用同一个产品族中的对象(如下代码的AppleFactory,BananaFactory)。
/**
* 抽象水果工厂
*/
public abstract class AbstractFactory {
public abstract Fruit getFruit();
public abstract Bag getBag();
}
/**
* 水果工厂
*/
public class AppleFactory extends AbstractFactory{
@Override
public Fruit getFruit() {
return new Apple();
}
@Override
public Bag getBag() {
return new AppleBag();
}
}
/**
* 水果工厂
*/
public class BananaFactory extends AbstractFactory{
@Override
public Fruit getFruit() {
return new Banana();
}
@Override
public Bag getBag() {
return new BananaBag();
}
}
/**
* 抽象工厂模式测试
* 按订单发送货品给客户
* Created by Peter on 10/8 008.
*/
public class OrderSendClient {
public static void main(String[] args){
sendFruit();
}
public static void sendFruit(){
//初始化工厂
AbstractFactory factory = new AppleFactory();//spring使用注入方式
//得到水果
Fruit fruit = factory.getFruit();
fruit.draw();
//得到包装
Bag bag = factory.getBag();
bag.pack();
//以下物流运输业务。。。。
}
}
抽象工厂模式类图:
以上代码缺少一些实体类接口类,Fruit,Apple,Banana,Bag,AppleBag等等,主要学习这个设计思路
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- 简单工厂模式、工厂模式、抽象工厂模式的解析-iOS
- Swift中的工厂方法和抽象工厂
- Java 设计模式之工厂方法模式与抽象工厂模式
- 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript
- 设计模式之工厂模式(为什么很多人觉得工厂模式没有用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First HTML5 Programming
Eric Freeman、Elisabeth Robson / O'Reilly Media / 2011-10-18 / USD 49.99
What can HTML5 do for you? If you're a web developer looking to use this new version of HTML, you might be wondering how much has really changed. Head First HTML5 Programming introduces the key featur......一起来看看 《Head First HTML5 Programming》 这本书的介绍吧!